// WeakMap的键名所指向的对象，不计入垃圾回收机制
// WeakMap只接受对象作为键名(null除外)，不接受其他类型的值作为键名。
// WeakMap的设计目的在于，有时我们想在某个对象上面存放一些数据，但是这会形成对于这个对象的引用。
// 一旦不再需要这个对象，我们就必须手动删除这个引用，否则垃圾回收机制就不会释放其占用的内存
// WeakMap设置的属性对象, 一旦对象被删除, 该状态就会自动消失，不存在内存泄漏风险
const resizeDomMap = new WeakMap()
// 监听dom变化
const ob = new ResizeObserver((entries) => {
  for (const entry of entries) {
    const handler = resizeDomMap.get(entry.target)
    handler &&
      handler({
        width: entry.borderBoxSize[0].inlineSize,
        height: entry.borderBoxSize[0].blockSize,
      })
  }
})

export default {
  mounted(el: any, binding: any) {
    resizeDomMap.set(el, binding.value)
    ob.observe(el)
  },
  onUnmounted(el: any) {
    ob.unobserve(el)
  },
}
